package pe.edu.upc.dew.bibliotecaweb.dao;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import pe.edu.upc.dew.bibliotecaweb.model.Ejemplar;
import pe.edu.upc.dew.bibliotecaweb.model.Libro;
import pe.edu.upc.dew.bibliotecaweb.model.Persona;
import pe.edu.upc.dew.bibliotecaweb.model.Prestamo;
import pe.edu.upc.dew.bibliotecaweb.model.Reserva;

/**
 * @author DEW 2010
 * Clase PrestamoDao encargada de comunicarse y realizar las consultas a la base de datos (Préstamo)
 */
public class PrestamoDao {

    /**
     * Método que se encarga de grabar en la base de datos el préstamo realizado
     * @param prestamo  Recibe un objeto Prestamo con toda la información necesaria para hacer el registro en la base de datos
     */
    public void generaPrestamo(Prestamo prestamo) {
        Connection cnt = null;
        Statement st = null;
        try {
            cnt = ConnectionUtils.getConnection();
            st = cnt.createStatement();
            st.execute("INSERT INTO PRESTAMO (FECHAPRESTAMO, FECHADEVOLUCION, ESTADOPRESTAMO,IDEJEMPLAR, IDRESERVA) VALUES ('" +
                    prestamo.getFechaPrestamo() + "','" + prestamo.getFechaDevolucion() + "','P'," +
                    prestamo.getEjemplar().getIdEjemplar() + "," + prestamo.getReserva().getIdReserva() + ")");
            System.out.println("SE INGRESO EL PRESTAMO CORRECTAMENTE");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ConnectionUtils.closeStatement(st);
            ConnectionUtils.closeConnection(cnt);
        }
    }

    /**
     * Método que se encarga de registrar la devolución de un libro. Actualiza el estado del préstamo a devuelto.
     */
    public void registraDevolucion(Integer idPrestamo) {

        Connection cnt = null;
        Statement st = null;
        try {
            cnt = ConnectionUtils.getConnection();
            st = cnt.createStatement();
            st.execute("UPDATE PRESTAMO SET ESTADOPRESTAMO='D' WHERE IDPRESTAMO = " + idPrestamo);
            System.out.println("SE REGISTRO LA DEVOLUCION CORRECTAMENTE");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ConnectionUtils.closeStatement(st);
            ConnectionUtils.closeConnection(cnt);
        }
    }

     /**
     * Método que se encarga de buscar el préstamo generado por un usuario
     * @param idpersona Cadena que contiene el nombre de usuario ingresado en la búsqueda de prestamos, desde la página de Devolucion
     * @return Retorna un bean Prestamo con toda la información del prestamo generado que se pueda haber encontrado al usuario ingresado.
     * En caso no encontrara prestamos por ejecutar, retorna el objeto como null
     */
    public Prestamo getPrestamoPorUsuario(String idpersona) {
        Connection cnt = null;
        Statement st = null;
        ResultSet rs = null;
        Libro libro = null;
        Persona persona = null;
        Prestamo prestamo = null;
        Ejemplar ejemplar = null;
        try {
            cnt = ConnectionUtils.getConnection();
            st = cnt.createStatement();
            rs = st.executeQuery("SELECT IDPRESTAMO, FECHAPRESTAMO, FECHADEVOLUCION, IDEJEMPLAR, TITULOLIBRO, NOMBREPERSONA FROM " +
                    "PRESTAMO PR INNER JOIN RESERVA R ON PR.IDRESERVA = R.IDRESERVA INNER JOIN " +
                    "PERSONA P ON R.IDPERSONA = P.IDPERSONA INNER JOIN LIBRO L ON R.IDLIBRO = L.IDLIBRO " +
                    "WHERE PR.ESTADOPRESTAMO = 'P' AND USUARIOPERSONA ='" + idpersona + "'");
            if (rs.next()) {
                prestamo = new Prestamo();
                prestamo.setIdPrestamo(rs.getInt("IDPRESTAMO"));
                prestamo.setFechaDevolucion(rs.getString("FECHADEVOLUCION"));
                prestamo.setFechaPrestamo(rs.getString("FECHAPRESTAMO"));
                ejemplar = new Ejemplar();
                ejemplar.setIdEjemplar(rs.getInt("IDEJEMPLAR"));
                libro = new Libro();
                libro.setTituloLibro(rs.getString("TITULOLIBRO"));
                ejemplar.setLibro(libro);
                prestamo.setEjemplar(ejemplar);
                persona = new Persona();
                persona.setNombrePersona(rs.getString("NOMBREPERSONA"));
                Reserva reserva = new Reserva();
                reserva.setPersona(persona);
                prestamo.setReserva(reserva);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ConnectionUtils.closeResultSet(rs);
            ConnectionUtils.closeStatement(st);
            ConnectionUtils.closeConnection(cnt);
        }
        return prestamo;
    }
}
